# -*- coding: utf-8 -*-#
"""
@File : ccgp.py
@Description : 
@Author : Le.Qing
@Create Time : 2025-04-29 9:53
"""
import json

import scrapy
from scrapy.http import HtmlResponse

# 自定义的爬虫类 , 继承scrapy.Spider
class CCGPSpider(scrapy.Spider):
    # 爬虫的名字
    name = 'ccgp'
    # 允许采集的域名范围
    # allowed_domains = ['movie.douban.com']
    # 开始采集的网址
    start_urls = ['https://www.ccgp-anhui.gov.cn/portal/category']

    def start_requests(self):
        url = 'https://www.ccgp-anhui.gov.cn/portal/category'
        payload = {
            "pageNo": 1,
            "pageSize": 15,
            "categoryCode": "anhuiCategory102",
            "_t": 1745815300000
        }

        yield scrapy.Request(
            url=url,
            method='POST',
            body=json.dumps(payload),  # 将字典转为JSON字符串
            headers=dict(self.settings.get('DEFAULT_REQUEST_HEADERS', {})),
            callback=self.parse_response
        )

    # 数据提前的方法, 接受引擎给的响应对象
    # 爬虫文件当中一定要有parse函数
    # 代码提示   指定response的数据类型
    def parse_response(self, response: HtmlResponse, **kwargs):
        # print(response.url) # 查看响应的网址
        # print(response.status) # 查看状态码
        # print(response.body) # http的响应体  bytes的类型
        # print(response.encoding) # 响应体的 编码
        # print(response.request) # 查看请求对象
        # print(response.selector()) # 选择器提取方式
        # print(response.xpath())  # xpath提取方式
        # print(response.urljoin()) # 用来构造url
        # print(response.request.headers)

        # 写提取的代码
        # xpath 返回的也是一个列表数据类型   返回的是Selector对象
        # exract_first 取出里边里面的一个元素
        # exract 取出全部的数据
        print('执行了parse_response函数')
        try:
            data = json.loads(response.text)  # 直接转为字典
            dataList = data['result']['data']['data']
            for index, item in enumerate(dataList):
                print(str(1) + '-' + str(index + 1), item['title'])
            return data  # 这里需要返回字典，否则pipelines不执行
        except json.JSONDecodeError as e:
            self.logger.error(f"JSON 解析失败: {e}, 原始响应: {response.text}")
            return None


if __name__ == '__main__':
    # 命令行执行代码
    from scrapy import cmdline
    cmdline.execute('scrapy crawl ccgp'.split())
